import wepy from 'wepy';
import tips from './tips'
import wxUtils from './wxUtils'

export default class basepage extends wepy.page {
    data = {}
    config = {}
    methods = {
    }

    async onLoad(option) {        
        let that = this;
        var initRs = await wxUtils.waitAppInit(); // 等待小程序初始化完成
        if (!initRs) {
            return "stop"; //小程序初始化失败，不再往下执行
        }
        // 前置条件检查
        var preCheck = await this.onPreBind(option).catch(ex => {
            console.log(ex);
            wxUtils.goToErrorPage(500); ///转到500页，系统开小差
            return false;
        })
        if (!preCheck) {
            return "stop"; //前置检查出错了，不再执行逻辑
        }
        
        // 绑定页面数据
        var bindRs = await that.bindApiData(option).catch(ex => {
            wxUtils.logError(ex);
            // 页面初始化失败
            that.isInit = true;
            if (!ex.hasSendDebug) {
                console.log("页面加载失败", ex);
            }
            wxUtils.goToErrorPage(500);
            return "stop";
        });
        tips.loaded(); ///关闭加载层
        if (bindRs != "stop" && bindRs != false) {
            this.pageIsReady = true;
            wx.setNavigationBarTitle({ title: that.pageTitle });
            that.$apply();
        } else {
            that.isInit = true;
        }
    }

    // 跳转报错页
    goToErrorPage(bizcode, msg = null) {
        wxUtils.goToErrorPage(bizcode, msg);
    }

    // 新增成功、删除成功、编辑成功
    showSuccess(title) {
        this.closeLoading();
        return tips.success(title);
    }

    // 显示加载层
    showLoading(title = "") {
        tips.loading(title);
    }

    // 关闭加载层
    closeLoading() {
        this.btn_closeload(); //关闭加载状态
        tips.loaded();
    }

    // 模态框
    async showConfirm(text, title = '确认提示') {
        this.closeLoading();
        return tips.confirm(text, title).then(res => {
            return res.confirm;
        });
    }

    // 统一异常拦截，所有的异步方法都可以用这个进行统一处理
    async awtRs(asyncFun) {        
        var res = await wxUtils.awtAsyncFun(asyncFun).catch(ex => {
            console.log(ex)
            this.showErrorMsg("系统开⼩差了，程序员⼩哥正在抢修中", false);
            throw (ex);
        });

        if (res && res.Next && res.HttpCode && res.HttpCode != 200) {
            res.Next = false;
            if (!this.pageIsReady) {
                ///页面级的非200状态统一处理
                
                this.goToErrorPage(res.HttpCode);
            } else {
                ///操作级的非200状态的统一处理
                switch (res.HttpCode) {
                    case 500:
                        this.showErrorMsg("系统开⼩差了，程序员⼩哥正在抢修中", false);
                         ///这种状态需要上报信息
                        break;
                    case 400:
                        let pname = res.Pname;
                        if (!panme || panme == "") {
                            pname = res.Msg;
                        } else {
                            pname = "参数校验错误：" + pname;
                        }
                        this.showErrorMsg(pname, false);
                         ///这种状态需要上报信息
                        break;
                    case 502:
                    case 503:
                        this.showErrorMsg("网络不给力，请稍后再试", false);
                        break;
                    case 504:
                        this.showErrorMsg("网络不给力，请稍后再试", false);
                        break;
                    case 506:
                        this.showErrorMsg("网络异常、断网了", false);
                        break;
                    case 404:
                        this.showErrorMsg("请求错误，请稍后再试");
                         ///这种状态需要上报信息
                        break;
                    default:
                        this.showErrorMsg(res, true);
                }
            }
        }
        return res;
    }

    // 数据绑定逻辑
    async bindApiData(option) {
        throw new error("未实现基类basepagebindApiData方法"); // 这个方法需子类实现
    }

    // bindApiData执行前的操作，如果return false; 表示检查不通过，不会再执行bindApiData
    async onPreBind(option) {
        return true;
    }

    // 通用错误提示，2秒钟，是否上报错误信息
    async showErrorMsg(res, sendToFundebug = false, keyName = null) {
        // 页面级操作时，系统开小差
        if(!this.pageIsReady)
        {
            console.error(res.ApiPath,"异常",res)
            wxUtils.goToErrorPage(500); //系统开小
            return "stop";
        }

        this.closeLoading();
        let msg = this.getMsgDetail(res);
        return Tips.text(msg).then(rs => {
            return "end"
        });
    }
}